package com.sky.legend;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
// https://tlias.itcast.cn/tz/classStudentList?name=陈&age=22


public class Demo {
    public static void main(String[] args) throws Exception {
        System.out.println("欢迎来到贪玩蓝月之热血传奇，请开始您的征途~~~");
        System.out.println("----------主将英雄-----------");
        // 创建主将英雄
        Hero master = new Hero();
        master.setName("llllllll");
        master.setGrade(110);
        // 创建装备对象
        Equip e = new Equip("赤月套装", 80);
        master.setEquip(e);
        // 创建技能对象
        Skill s = new Skill("逐日剑法", 3, 300);
        master.setSkill(s);
        // 调用英雄攻击方法
        master.attack();
        System.out.println("----------召唤副将英雄-----------");
        // 调用召唤副将英雄方法，获取副将英雄对象
        Hero hero = master.summonHero();
        hero.attack();

        System.out.println("------------修改副将英雄装备和技能后--------------");
        // 修改副将英雄名称
        hero.setName("llllllll宝宝");
        // 修改副将英雄装备
        Equip e2 = new Equip("祖玛套装", 50);
        hero.setEquip(e2);
        // 修改副将英雄技能
        Skill s2 = new Skill("烈火刀法", 3, 200);
        hero.setSkill(s2);
        // 再次调用英雄攻击方法
        master.attack();
        hero.attack();

    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Hero implements Cloneable {
    private String name;  // 英雄名称
    private int grade;    // 英雄等级
    private Equip equip;  // 英雄装备
    private Skill skill;  // 英雄技能

    // 攻击
    public void attack() {
        System.out.println(grade + "等级玩家" + name + "，一身" + equip.getName() + "套装，攻击" + equip.getDamage() +
                "，正在祖玛宫殿用" + skill.getGrade() + "级的" + skill.getName() + "技能刷怪，每次技能伤害" + skill.getDamage() + "。");
    }

    // 召唤英雄
    public Hero summonHero() throws Exception {
        Hero hero = (Hero) super.clone();
        hero.equip = (Equip) equip.clone();
        hero.skill = (Skill) skill.clone();
        return hero;
    }

}

class Equip extends Hero implements Cloneable {
    // 装备名称，使用父类成员
    private int damage; // 攻击属性值

    public Equip(String name, int damage) {
        super.setName(name);
        this.damage = damage;
    }

    public Equip(int damage) {
        this.damage = damage;
    }

    public int getDamage() {
        return damage;
    }

    public void setDamage(int damage) {
        this.damage = damage;
    }
}

class Skill extends Hero implements Cloneable {
    // 技能名称和技能等级，使用父类成员
    private int damage; // 技能伤害值

    public Skill(String name, int grade, int damage) {
        super.setName(name);
        super.setGrade(grade);
        this.damage = damage;
    }

    public Skill(int damage) {
        this.damage = damage;
    }

    public int getDamage() {
        return damage;
    }

    public void setDamage(int damage) {
        this.damage = damage;
    }
}